home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.31-14 / scripts / patch-kernel < prev    next >
Text File  |  2009-09-09  |  10KB  |  328 lines

  1. #! /bin/sh
  2. # Script to apply kernel patches.
  3. #   usage: patch-kernel [ sourcedir [ patchdir [ stopversion ] [ -acxx ] ] ]
  4. #     The source directory defaults to /usr/src/linux, and the patch
  5. #     directory defaults to the current directory.
  6. # e.g.
  7. #   scripts/patch-kernel . ..
  8. #      Update the kernel tree in the current directory using patches in the
  9. #      directory above to the latest Linus kernel
  10. #   scripts/patch-kernel . .. -ac
  11. #      Get the latest Linux kernel and patch it with the latest ac patch
  12. #   scripts/patch-kernel . .. 2.4.9
  13. #      Gets standard kernel 2.4.9
  14. #   scripts/patch-kernel . .. 2.4.9 -ac
  15. #      Gets 2.4.9 with latest ac patches
  16. #   scripts/patch-kernel . .. 2.4.9 -ac11
  17. #      Gets 2.4.9 with ac patch ac11
  18. #   Note: It uses the patches relative to the Linus kernels, not the
  19. #   ac to ac relative patches
  20. #
  21. # It determines the current kernel version from the top-level Makefile.
  22. # It then looks for patches for the next sublevel in the patch directory.
  23. # This is applied using "patch -p1 -s" from within the kernel directory.
  24. # A check is then made for "*.rej" files to see if the patch was
  25. # successful.  If it is, then all of the "*.orig" files are removed.
  26. #
  27. #       Nick Holloway <Nick.Holloway@alfie.demon.co.uk>, 2nd January 1995.
  28. #
  29. # Added support for handling multiple types of compression. What includes
  30. # gzip, bzip, bzip2, zip, compress, and plaintext. 
  31. #
  32. #       Adam Sulmicki <adam@cfar.umd.edu>, 1st January 1997.
  33. #
  34. # Added ability to stop at a given version number
  35. # Put the full version number (i.e. 2.3.31) as the last parameter
  36. #       Dave Gilbert <linux@treblig.org>, 11th December 1999.
  37.  
  38. # Fixed previous patch so that if we are already at the correct version
  39. # not to patch up.
  40. #
  41. # Added -ac option, use -ac or -ac9 (say) to stop at a particular version
  42. #       Dave Gilbert <linux@treblig.org>, 29th September 2001.
  43. #
  44. # Add support for (use of) EXTRAVERSION (to support 2.6.8.x, e.g.);
  45. # update usage message;
  46. # fix some whitespace damage;
  47. # be smarter about stopping when current version is larger than requested;
  48. #    Randy Dunlap <rdunlap@xenotime.net>, 2004-AUG-18.
  49. #
  50. # Add better support for (non-incremental) 2.6.x.y patches;
  51. # If an ending version number if not specified, the script automatically
  52. # increments the SUBLEVEL (x in 2.6.x.y) until no more patch files are found;
  53. # however, EXTRAVERSION (y in 2.6.x.y) is never automatically incremented
  54. # but must be specified fully.
  55. #
  56. # patch-kernel does not normally support reverse patching, but does so when
  57. # applying EXTRAVERSION (x.y) patches, so that moving from 2.6.11.y to 2.6.11.z
  58. # is easy and handled by the script (reverse 2.6.11.y and apply 2.6.11.z).
  59. #    Randy Dunlap <rdunlap@xenotime.net>, 2005-APR-08.
  60.  
  61. PNAME=patch-kernel
  62.  
  63. # Set directories from arguments, or use defaults.
  64. sourcedir=${1-/usr/src/linux}
  65. patchdir=${2-.}
  66. stopvers=${3-default}
  67.  
  68. if [ "$1" = -h -o "$1" = --help -o ! -r "$sourcedir/Makefile" ]; then
  69. cat << USAGE
  70. usage: $PNAME [-h] [ sourcedir [ patchdir [ stopversion ] [ -acxx ] ] ]
  71.   source directory defaults to /usr/src/linux,
  72.   patch directory defaults to the current directory,
  73.   stopversion defaults to <all in patchdir>.
  74. USAGE
  75. exit 1
  76. fi
  77.  
  78. # See if we have any -ac options
  79. for PARM in $*
  80. do
  81.   case $PARM in
  82.       -ac*)
  83.           gotac=$PARM;
  84.  
  85.     esac;
  86. done
  87.  
  88. # ---------------------------------------------------------------------------
  89. # arg1 is filename
  90. noFile () {
  91.     echo "cannot find patch file: ${patch}"
  92.     exit 1
  93. }
  94.  
  95. # ---------------------------------------------------------------------------
  96. backwards () {
  97.     echo "$PNAME does not support reverse patching"
  98.     exit 1
  99. }
  100.  
  101. # ---------------------------------------------------------------------------
  102. # Find a file, first parameter is basename of file
  103. # it tries many compression mechanisms and sets variables to say how to get it
  104. findFile () {
  105.   filebase=$1;
  106.  
  107.   if [ -r ${filebase}.gz ]; then
  108.         ext=".gz"
  109.         name="gzip"
  110.         uncomp="gunzip -dc"
  111.   elif [ -r ${filebase}.bz  ]; then
  112.         ext=".bz"
  113.         name="bzip"
  114.         uncomp="bunzip -dc"
  115.   elif [ -r ${filebase}.bz2 ]; then
  116.         ext=".bz2"
  117.         name="bzip2"
  118.         uncomp="bunzip2 -dc"
  119.   elif [ -r ${filebase}.zip ]; then
  120.         ext=".zip"
  121.         name="zip"
  122.         uncomp="unzip -d"
  123.   elif [ -r ${filebase}.Z ]; then
  124.         ext=".Z"
  125.         name="uncompress"
  126.         uncomp="uncompress -c"
  127.   elif [ -r ${filebase} ]; then
  128.         ext=""
  129.         name="plaintext"
  130.         uncomp="cat"
  131.   else
  132.     return 1;
  133.   fi
  134.  
  135.   return 0;
  136. }
  137.  
  138. # ---------------------------------------------------------------------------
  139. # Apply a patch and check it goes in cleanly
  140. # First param is patch name (e.g. patch-2.4.9-ac5) - without path or extension
  141.  
  142. applyPatch () {
  143.   echo -n "Applying $1 (${name})... "
  144.   if $uncomp ${patchdir}/$1${ext} | patch -p1 -s -N -E -d $sourcedir
  145.   then
  146.     echo "done."
  147.   else
  148.     echo "failed.  Clean up yourself."
  149.     return 1;
  150.   fi
  151.   if [ "`find $sourcedir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ]
  152.   then
  153.     echo "Aborting.  Reject files found."
  154.     return 1;
  155.   fi
  156.   # Remove backup files
  157.   find $sourcedir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \;
  158.  
  159.   return 0;
  160. }
  161.  
  162. # ---------------------------------------------------------------------------
  163. # arg1 is patch filename
  164. reversePatch () {
  165.     echo -n "Reversing $1 (${name}) ... "
  166.     if $uncomp ${patchdir}/"$1"${ext} | patch -p1 -Rs -N -E -d $sourcedir
  167.     then
  168.         echo "done."
  169.     else
  170.         echo "failed.  Clean it up."
  171.         exit 1
  172.     fi
  173.     if [ "`find $sourcedir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ]
  174.     then
  175.         echo "Aborting.  Reject files found."
  176.         return 1
  177.     fi
  178.     # Remove backup files
  179.     find $sourcedir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \;
  180.  
  181.     return 0
  182. }
  183.  
  184. # set current VERSION, PATCHLEVEL, SUBLEVEL, EXTRAVERSION
  185. # force $TMPFILEs below to be in local directory: a slash character prevents
  186. # the dot command from using the search path.
  187. TMPFILE=`mktemp ./.tmpver.XXXXXX` || { echo "cannot make temp file" ; exit 1; }
  188. grep -E "^(VERSION|PATCHLEVEL|SUBLEVEL|EXTRAVERSION)" $sourcedir/Makefile > $TMPFILE
  189. tr -d [:blank:] < $TMPFILE > $TMPFILE.1
  190. . $TMPFILE.1
  191. rm -f $TMPFILE*
  192. if [ -z "$VERSION" -o -z "$PATCHLEVEL" -o -z "$SUBLEVEL" ]
  193. then
  194.     echo "unable to determine current kernel version" >&2
  195.     exit 1
  196. fi
  197.  
  198. NAME=`grep ^NAME $sourcedir/Makefile`
  199. NAME=${NAME##*=}
  200.  
  201. echo "Current kernel version is $VERSION.$PATCHLEVEL.$SUBLEVEL${EXTRAVERSION} ($NAME)"
  202.  
  203. # strip EXTRAVERSION to just a number (drop leading '.' and trailing additions)
  204. EXTRAVER=
  205. if [ x$EXTRAVERSION != "x" ]
  206. then
  207.     EXTRAVER=${EXTRAVERSION#.}
  208.     EXTRAVER=${EXTRAVER%%[[:punct:]]*}
  209.     #echo "$PNAME: changing EXTRAVERSION from $EXTRAVERSION to $EXTRAVER"
  210. fi
  211.  
  212. #echo "stopvers=$stopvers"
  213. if [ $stopvers != "default" ]; then
  214.     STOPSUBLEVEL=`echo $stopvers | cut -d. -f3`
  215.     STOPEXTRA=`echo $stopvers | cut -d. -f4`
  216.     STOPFULLVERSION=${stopvers%%.$STOPEXTRA}
  217.     #echo "#___STOPSUBLEVEL=/$STOPSUBLEVEL/, STOPEXTRA=/$STOPEXTRA/"
  218. else
  219.     STOPSUBLEVEL=9999
  220.     STOPEXTRA=9999
  221. fi
  222.  
  223. # This all assumes a 2.6.x[.y] kernel tree.
  224. # Don't allow backwards/reverse patching.
  225. if [ $STOPSUBLEVEL -lt $SUBLEVEL ]; then
  226.     backwards
  227. fi
  228.  
  229. if [ x$EXTRAVER != "x" ]; then
  230.     CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL.$EXTRAVER"
  231. else
  232.     CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL"
  233. fi
  234.  
  235. if [ x$EXTRAVER != "x" ]; then
  236.     echo "backing up to: $VERSION.$PATCHLEVEL.$SUBLEVEL"
  237.     patch="patch-${CURRENTFULLVERSION}"
  238.     findFile $patchdir/${patch} || noFile ${patch}
  239.     reversePatch ${patch} || exit 1
  240. fi
  241.  
  242. # now current is 2.6.x, with no EXTRA applied,
  243. # so update to target SUBLEVEL (2.6.SUBLEVEL)
  244. # and then to target EXTRAVER (2.6.SUB.EXTRAVER) if requested.
  245. # If not ending sublevel is specified, it is incremented until
  246. # no further sublevels are found.
  247.  
  248. if [ $STOPSUBLEVEL -gt $SUBLEVEL ]; then
  249. while :                # incrementing SUBLEVEL (s in v.p.s)
  250. do
  251.     CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL"
  252.     EXTRAVER=
  253.     if [ $STOPFULLVERSION = $CURRENTFULLVERSION ]; then
  254.         echo "Stopping at $CURRENTFULLVERSION base as requested."
  255.         break
  256.     fi
  257.  
  258.     SUBLEVEL=$(($SUBLEVEL + 1))
  259.     FULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL"
  260.     #echo "#___ trying $FULLVERSION ___"
  261.  
  262.     if [ $(($SUBLEVEL)) -gt $(($STOPSUBLEVEL)) ]; then
  263.     echo "Stopping since sublevel ($SUBLEVEL) is beyond stop-sublevel ($STOPSUBLEVEL)"
  264.     exit 1
  265.     fi
  266.  
  267.     patch=patch-$FULLVERSION
  268.     # See if the file exists and find extension
  269.     findFile $patchdir/${patch} || noFile ${patch}
  270.  
  271.     # Apply the patch and check all is OK
  272.     applyPatch $patch || break
  273. done
  274. #echo "#___sublevel all done"
  275. fi
  276.  
  277. # There is no incremental searching for extraversion...
  278. if [ "$STOPEXTRA" != "" ]; then
  279. while :                # just to allow break
  280. do
  281. # apply STOPEXTRA directly (not incrementally) (x in v.p.s.x)
  282.     FULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL.$STOPEXTRA"
  283.     #echo "#... trying $FULLVERSION ..."
  284.     patch=patch-$FULLVERSION
  285.  
  286.     # See if the file exists and find extension
  287.     findFile $patchdir/${patch} || noFile ${patch}
  288.  
  289.     # Apply the patch and check all is OK
  290.     applyPatch $patch || break
  291.     #echo "#___extraver all done"
  292.     break
  293. done
  294. fi
  295.  
  296. if [ x$gotac != x ]; then
  297.   # Out great user wants the -ac patches
  298.     # They could have done -ac (get latest) or -acxx where xx=version they want
  299.     if [ $gotac = "-ac" ]; then
  300.       # They want the latest version
  301.         HIGHESTPATCH=0
  302.         for PATCHNAMES in $patchdir/patch-${CURRENTFULLVERSION}-ac*\.*
  303.         do
  304.             ACVALUE=`echo $PATCHNAMES | sed -e 's/^.*patch-[0-9.]*-ac\([0-9]*\).*/\1/'`
  305.             # Check it is actually a recognised patch type
  306.             findFile $patchdir/patch-${CURRENTFULLVERSION}-ac${ACVALUE} || break
  307.  
  308.           if [ $ACVALUE -gt $HIGHESTPATCH ]; then
  309.               HIGHESTPATCH=$ACVALUE
  310.           fi
  311.         done
  312.  
  313.         if [ $HIGHESTPATCH -ne 0 ]; then
  314.             findFile $patchdir/patch-${CURRENTFULLVERSION}-ac${HIGHESTPATCH} || break
  315.             applyPatch patch-${CURRENTFULLVERSION}-ac${HIGHESTPATCH}
  316.         else
  317.           echo "No -ac patches found"
  318.         fi
  319.     else
  320.       # They want an exact version
  321.         findFile $patchdir/patch-${CURRENTFULLVERSION}${gotac} || {
  322.           echo "Sorry, I couldn't find the $gotac patch for $CURRENTFULLVERSION.  Hohum."
  323.             exit 1
  324.         }
  325.         applyPatch patch-${CURRENTFULLVERSION}${gotac}
  326.     fi
  327. fi
  328.